package com.liuyu.common.framework.template.htmltopdf.utils;

import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;

import java.io.File;
import java.io.FilenameFilter;
import java.io.OutputStream;

/**
 *
 * @author liuyu
 * @date 2021/8/23 15:46
 */
public class HtmlToPdfUtil {

    /**
     * html转pdf
     * @param os                    输出流
     * @param templateFilePath      ftl模板路径
     * @param fontPath              字体文件路径
     * @param htmlBasePath          模板生成html中相对路径的基础路径（例如img的src）
     * @param data                  模板生成html的数据类
     * @throws Exception
     */
    public static void htmlToPdf(OutputStream os, String templateFilePath, String fontPath, String htmlBasePath, Object data) throws Exception {
        String html = FreeMarkerUtil.getContent(templateFilePath, data);

        PdfRendererBuilder builder = new PdfRendererBuilder();
        builder.useFastMode();
        // 设置字体（需在html上css定义字体），否则中文会变成###
        addFont(builder, fontPath);

        // 第一个参数是要转换的html，第二个参数是空的模板（必须htm后缀）
        // 用于转换图片
        builder.withHtmlContent(html, htmlBasePath);

        builder.toStream(os);
        builder.run();
    }

    /**
     * 读取字体文件
     * @param builder
     * @param fontPath
     */
    public static void addFont(PdfRendererBuilder builder, String fontPath) {
        File fontFolder = new File(fontPath);
        if (fontFolder.isDirectory()) {
            File[] files = fontFolder.listFiles(new FilenameFilter() {
                @Override
                public boolean accept(File dir, String name) {
                    String lower = name.toLowerCase();
                    return lower.endsWith(".ttf") || lower.endsWith(".ttc");
                }
            });
            for (File subFile : files) {
                String fontFamily = subFile.getName().substring(0, subFile.getName().lastIndexOf("."));
                builder.useFont(subFile, fontFamily);
            }
        }
    }
}
